#include <opencv2/opencv.hpp>
#include <dlib/opencv.h>
#include <dlib/image_processing/frontal_face_detector.h>
#include <dlib/gui_widgets.h> // 添加dlib窗口支持
#define INTV 10 // 间隔多少帧做一次人脸识别
using namespace std; // 使用标准命名空间
int main() {
int count = 0;
// 创建VideoCapture对象，参数0表示打开默认摄像头，也可以指定视频文件路径或摄像头索引号
cv::VideoCapture cap(0);
if (!cap.isOpened()) {
cerr << "无法打开摄像头" << endl;
return -1;
}
// 创建dlib图像窗口
dlib::image_window win;
// 初始化人脸检测器
dlib::frontal_face_detector detector = dlib::get_frontal_face_detector();
// 主循环，持续捕获和显示视频帧
while (true) {
cv::Mat frame; // 创建一个Mat对象来存储当前帧
// 从摄像头捕获一帧图像，运算符>>重载了视频帧捕获功能
cap >> frame;
// 检查捕获的帧是否为空，如果为空则退出循环
if (frame.empty()) {
break;
}
// 将OpenCV Mat转换为dlib格式
dlib::cv_image<dlib::bgr_pixel> dlib_img(frame);
// 显示图像
win.set_image(dlib_img);
// 使用dlib窗口的点击事件检测代替waitKey
if (win.is_closed()) { // 检查窗口是否被关闭
break;
}
// 每INTV帧检测一次人脸
if (count % INTV == 0) {
// 调用人脸检测，detector，返回人脸矩形框列表
std::vector<dlib::rectangle> faces = detector(dlib_img);
// 显示结果：打印人脸数量和每个矩形框的四个点
cout << "检测到人脸数量: " << faces.size() << endl;
for (const auto& face : faces) {
// 该程序实现了实时人脸检测与拍照功能。它每隔 INTV 帧对摄像头采集的图像进行一次人脸检测，并将
// 检测到的人脸用矩形框标出显示在图像窗口上。
// 2. 修改 CMakeLists.txt
// 在 myapp/CMakeLists.txt 文件中添加 capture_detect 的编译目标。修改后的
// CMakeLists.txt 内容示例：
// 6.2 重新编译项目并运行 capture_detect
// 1. 重新编译项目
// 进入 myapp/build 目录：
cout << "人脸矩形框: 左上角(" << face.left() << ", " << face.top()
<< "), 右下角(" << face.right() << ", " << face.bottom() <<
")" << endl;
}
// 清空显示窗口的内容，方便重新绘制矩形框
win.clear_overlay();
// 在dlib窗口中显示图像和人脸框
win.add_overlay(faces, dlib::rgb_pixel(255, 0, 0));
}
// 增加帧计数
count++;
// 保留一个小的延迟
dlib::sleep(30);
}
return 0; // 程序正常退出
}